﻿using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.DependencyInjection;

namespace _04_配置_01
{
    internal class Program
    {
        static void Main(string[] args)
        {

            // 方式一
            /*
            ConfigurationBuilder configurationBuilder=new ConfigurationBuilder();
            // reloadOnChange 配置文件改了是否马上使用  optional:false 配置没有不报错
            configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: false);
            IConfigurationRoot config = configurationBuilder.Build();
            string name = config["name"];
            Console.WriteLine(name);
            string proxyAddress = config.GetSection("proxy:address").Value;
            Console.WriteLine(proxyAddress);
            */


            //方式二
            /*
            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            // reloadOnChange 配置文件改了是否马上使用  optional:false 配置没有不报错
            configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: false);
            IConfigurationRoot configRoot = configurationBuilder.Build();

            // 自获取二级对象
            //var proxy= configRoot.GetSection("proxy").Get<Proxy>();
            //Console.WriteLine(proxy.address);
            //Console.WriteLine(proxy.prot);

            //获取整个对象，包括二级
            Config config = configRoot.Get<Config>();
            Console.WriteLine(config.name);
            Console.WriteLine(config.proxy.address);
            */

            // 方式三 推荐使用
            // IOptions<T>  //不会读到新的值
            // IOptionsMonitor<T> 在一次http请求范围内，如果配置改变，都最新
            // IOptionsSnapshot<T> 在一次http请求范围内，如果配置改变，都旧的 ----建议使用

            ServiceCollection services = new ServiceCollection();
            services.AddScoped<TestController>();
            services.AddScoped<Test2>();

            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
            IConfigurationRoot configurationRoot = configurationBuilder.Build();
            // 模型类和节点绑定 ！！！！！
            services.AddOptions()
                .Configure<Config>(e => configurationRoot.Bind(e))
                .Configure<Proxy>(e => configurationRoot.GetSection("proxy").Bind(e));
            using (var sp = services.BuildServiceProvider())
            {
                var c=sp.GetRequiredService<TestController>();
                c.Test();
                //读取 对象里对象的属性
                Console.WriteLine("--------------");
                var c2=sp.GetRequiredService<Test2>();
                c2.Test();
            }


            

        }

    }


    public class Config
    {
        public string name { get; set; }
        public int age { get; set; }
        public Proxy proxy { get; set; }
    }
    public class Proxy
    {
        public string address { get; set; }
        public int prot { get; set; }
    }
}
